import os
import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from dotenv import load_dotenv
load_dotenv()
class AliyunAuthService:
    """
    用于获取阿里云 Token 的服务类。
    """

    def __init__(self, ak_id=None, ak_secret=None, region='cn-shanghai'):
        """
        初始化认证服务。

        Args:
            ak_id: 阿里云的 AccessKey ID。
            ak_secret: 阿里云的 AccessKey Secret。
            region: 阿里云的区域（默认为 'cn-shanghai'）。
        """
        # 从环境变量或直接传入的值初始化 Access Key 和 Secret
        self.ak_id = ak_id or os.getenv('ALIYUN_AK_ID')
        self.ak_secret = ak_secret or os.getenv('ALIYUN_AK_SECRET')
        self.region = region
        if not self.ak_id or not self.ak_secret:
            raise ValueError("Access Key ID and Secret must be provided.")

        # 创建AcsClient实例
        self.client = AcsClient(self.ak_id, self.ak_secret, self.region)

    def get_token(self):
        """
        获取阿里云 Token。
        该方法向阿里云服务请求 Token，并返回。

        Returns:
            dict: 包含 Token 和 ExpireTime 的字典。
        """
        response = self._request_token()
        if response and 'Token' in response and 'Id' in response['Token']:
            token = response['Token']['Id']
            expire_time = response['Token']['ExpireTime']
            return {
                'token': token,
                'expire_time': expire_time
            }
        else:
            raise Exception("Failed to retrieve token")

    def _request_token(self):
        """
        向阿里云的 NLS Meta 服务请求 Token。

        Returns:
            dict: 包含 Token 信息的字典。
        """
        # 创建 request，并设置参数
        request = CommonRequest()
        request.set_method('POST')
        request.set_domain('nls-meta.cn-shanghai.aliyuncs.com')
        request.set_version('2019-02-28')
        request.set_action_name('CreateToken')

        try:
            response = self.client.do_action_with_exception(request)
            return json.loads(response)
        except Exception as e:
            print(f"Error during request: {e}")
            return None


# 使用示例
if __name__ == "__main__":
    try:
        # 创建认证服务实例，传入阿里云的 Access Key 和 Secret
        #auth_service = AliyunAuthService('LTAI5t6L4sELDDzVEKbeuEpb', 'eCLVic5KYvyfPSIK0byhpQ0iycEQYy')
        auth_service = AliyunAuthService('LTAI5t6L4sELDDzVEKbeuEpb', 'eCLVic5KYvyfPSIK0byhpQ0iycEQYy')

        # 获取 Token
        token_data = auth_service.get_token()
        print(f"Token: {token_data['token']}")
        print(f"Expire Time: {token_data['expire_time']}")
    except Exception as e:
        print(f"Error: {e}")

